package com.wy.utils;

import sun.applet.Main;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * Io流操作：
 * IO流分为：字符流和字节流：
 * 字节流： 以字节byte进行传输，可以传输任意类型文件。速度较慢；inputStream，OutputStream
 * 字符流：以字符为单位进行传输，只能传输文本文件； 速度快；缓存区；Reader，Writer(可以按行读取）
 */
public class IOUtils {
    public static void main(String[] args) {
        //copyFile("D:\\myupload\\阅卷明细.txt","D:\\myupload\\阅卷明细2.txt");
        List<String> list = redaTxtFileToList("D:\\2021\\CSM-1\\day7\\src\\main\\resources\\data.txt");
        System.out.println(list);
    }
    //①　关闭流（7分）
    //Closeable...表示任意多个Closeable参数，或者说Closeable数组
    public static void closeStream(Closeable... closeAble) {
        for (Closeable closeable2 : closeAble) {
            try {
                closeable2.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //②　拷贝文件（7分）
    //根据文件路径，copy文件
    public static void copyFile(String oldFile,String targetFile){
        try {
            InputStream input = new FileInputStream(new File(oldFile));
            OutputStream output = new FileOutputStream(new File(targetFile));
            copyStream(input,output);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    //根据流copy文件
    public static void copyStream(InputStream input,OutputStream output){
        BufferedInputStream bis =null;
        BufferedOutputStream bos =null;
        try {
            if (input == null || output == null) return;
            // 输入流缓冲区
            bis = new BufferedInputStream(input);
            // 输出流缓冲区
            bos = new BufferedOutputStream(output);
            // 数组存储数据流
            byte[] buffer = new byte[1024];
            // 从输入流读取  直到最后返回-1时结束读取
            while (bis.read(buffer) != -1) {
                // 将读取的输入流  写入 输出流中
                bos.write(buffer);
            }
            // 由于使用了缓冲输出流。如果没有关闭该 流，则必须flush，如果关闭了这个流，在关闭时会自动flush
            bos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭流，一定要写在finally里边，避免代码运行过程中抛了异常，导致流没有关闭
            closeStream(input,output,bis,bos);
        }
    }
    //按行读取文本文件返回一个list集合;根据文件路径
    public static List<String> redaTxtFileToList(String filepath){
        File file = new File(filepath);
        return redaTxtFile(file);
    }
    //按行读取文本文件返回一个list集合;根据File
    public static List<String> redaTxtFile(File file){
        FileReader fileReader =null;
        BufferedReader br =null;
        try {
            if(file == null){
                return null;
            }
            // 创建集合用来收据数据
            List<String> list=new ArrayList<String>();
            // 输入字符流
            fileReader = new FileReader(file);
            // 输入流缓冲区
            br=new BufferedReader(fileReader);
            String readLine =null;
            while((readLine = br.readLine()) !=null){//按行读取
                list.add(readLine);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeStream(fileReader,br);
        }
        return null;
    }
}
